from mydb.postgre import base

base=base()

base.user='buh'
base.passwd='joczkRX7MkJrPk'
base.host='sa-serv10'
base.port=5432
base.base='ZUP_TEK'

#base.connect()

def ids(field, table):
	"This function returns keys for характер выплат (_Fld4008RRef) из _Document1047"
	return base.conn.prepare("SELECT DISTINCT "+field+" FROM "+table)()
#base.disconnect()


def findid(id):
	
	"This function returns list of [table, field]s with word"
	#beginnig of function suite
	
#	base.connect()
	
	fields=base.conn.prepare("SELECT table_name, column_name FROM information_schema.columns WHERE table_schema='public' and data_type LIKE '%bytea%'")()
	
	#fields=base.conn.prepare("SELECT table_name, column_name FROM information_schema.columns WHERE table_name LIKE '_reference%' AND (data_type LIKE '%USER-DEFINED%' OR data_type LIKE '%v%' OR data_type LIKE '%text%')")()
	
	#fields=base.conn.prepare("SELECT table_name, column_name FROM information_schema.columns WHERE data_type LIKE '%USER-DEFINED%' AND table_name LIKE '_reference%' AND table_name NOT LIKE '%_vt%' AND table_name NOT LIKE '%_chngr%' ORDER BY table_name asc")()
	
	result=[]
	counter=0
	for field in fields:
		counter+=1
		records=base.conn.prepare("SELECT DISTINCT "+field[1]+" FROM "+field[0]+" WHERE "+field[1]+"=$1")(id)
		if records and [field[0], field[1]] not in result:
			#result+=(records, field[0], field[1])
			result+=[[field[0], field[1]]]
			print([[field[0], field[1]]])
#	base.disconnect()
	
#	for i in result:
#		print(i)
	
	return (counter, result,)
	#end of function suite


def findids(ids):
	
	"This function returns list of [table, field]s with word"
	#beginnig of function suite
	
#	base.connect()
	
	fields=base.conn.prepare("SELECT table_name, column_name FROM information_schema.columns WHERE table_schema='public' and data_type LIKE '%bytea%'")()
	
	#fields=base.conn.prepare("SELECT table_name, column_name FROM information_schema.columns WHERE table_name LIKE '_reference%' AND (data_type LIKE '%USER-DEFINED%' OR data_type LIKE '%v%' OR data_type LIKE '%text%')")()
	
	#fields=base.conn.prepare("SELECT table_name, column_name FROM information_schema.columns WHERE data_type LIKE '%USER-DEFINED%' AND table_name LIKE '_reference%' AND table_name NOT LIKE '%_vt%' AND table_name NOT LIKE '%_chngr%' ORDER BY table_name asc")()
	
	result=[]
	counter=0
	for field in fields:
		counter+=1
		for id in ids:
			records=base.conn.prepare("SELECT DISTINCT "+field[1]+" FROM "+field[0]+" WHERE "+field[1]+"=$1")(id[0])
			if records and [field[0], field[1]] not in result:
				#result+=(records, field[0], field[1])
				result+=[[field[0], field[1]]]
				print([[field[0], field[1]]])
#	base.disconnect()
	
#	for i in result:
#		print(i)
	
	return (counter, result,)
	#end of function suite

def findword(word):
	
	"This function returns list of [table, field]s with word"
	#beginnig of function suite
	
#	base.connect()
	
	fields=base.conn.prepare("SELECT table_name, column_name FROM information_schema.columns WHERE table_schema='public' and (data_type LIKE '%USER-DEFINED%' OR data_type LIKE '%var%' OR data_type LIKE '%text%')")()
	
	#fields=base.conn.prepare("SELECT table_name, column_name FROM information_schema.columns WHERE table_name LIKE '_reference%' AND (data_type LIKE '%USER-DEFINED%' OR data_type LIKE '%v%' OR data_type LIKE '%text%')")()
	
	#fields=base.conn.prepare("SELECT table_name, column_name FROM information_schema.columns WHERE data_type LIKE '%USER-DEFINED%' AND table_name LIKE '_reference%' AND table_name NOT LIKE '%_vt%' AND table_name NOT LIKE '%_chngr%' ORDER BY table_name asc")()
	
	result=[]
	counter=0
	for field in fields:
		counter+=1
		records=base.conn.prepare("SELECT "+field[1]+" FROM "+field[0]+" WHERE "+field[1]+" LIKE '%"+word+"%'")()
		if records and [field[0], field[1]] not in result:
			#result+=(records, field[0], field[1])
			result+=[[field[0], field[1]]]
			print([[field[0], field[1]]])
#	base.disconnect()
	
#	for i in result:
#		print(i)
	
	return (counter, result,)
	#end of function suite

def both(a, ai, b, bi):
	result=[]
	for aa in a:
		for bb in b:
			if aa[ai] == bb[bi]:
				result+=[aa[ai]]
				print(aa[ai])
	return result

def find(table, field, word):
	"Function"
	_ids=ids(field, table)
	f=findids(_ids)
	s=findword(word)
	return [f[1],s[1]]
	
def getids(word):
	"This function returns [table, field, _idrref] for word"
	#beginnig of function suite
	
#	base.connect()
	
	fields=base.conn.prepare("SELECT table_name, column_name FROM information_schema.columns WHERE table_schema='public' and (data_type LIKE '%USER-DEFINED%' OR data_type LIKE '%var%' OR data_type LIKE '%text%')")()
	
	#fields=base.conn.prepare("SELECT table_name, column_name FROM information_schema.columns WHERE table_name LIKE '_reference%' AND (data_type LIKE '%USER-DEFINED%' OR data_type LIKE '%v%' OR data_type LIKE '%text%')")()
	
	#fields=base.conn.prepare("SELECT table_name, column_name FROM information_schema.columns WHERE data_type LIKE '%USER-DEFINED%' AND table_name LIKE '_reference%' AND table_name NOT LIKE '%_vt%' AND table_name NOT LIKE '%_chngr%' ORDER BY table_name asc")()
	
	result=[]
	counter=0
	for field in fields:
		counter+=1
		try:
			records=base.conn.prepare("SELECT _idrref FROM "+field[0]+" WHERE "+field[1]+" LIKE '%"+word+"%'")()
		except:
			pass
		else:
			if records and [field[0], field[1]] not in result:
				#result+=(records, field[0], field[1])
				result+=[[field[0], field[1], records]]
				print([[field[0], field[1], records]])
#	base.disconnect()
	
#	for i in result:
#		print(i)
	
	return (counter, result,)
	#end of function suite

def table(words=[], sums=[]):
	"This function returns table name and fields names for the given words and sums"
	#beginnig of function suite
	#Выбирается список полей таблиц схемы public
	fields=base.conn.prepare("SELECT table_name, column_name FROM information_schema.columns WHERE table_schema='public'")()
	#Создается пустой список полей-таблиц-значений для сумм
	results_sum=[]
	#Создается пустой список полей-таблиц-значений для слов
	results_word=[]
	#Для каждого поля в спике полей таблиц схемы public
	for field in fields:
		#Подготавливается запрос на выборку поля field для записей с соответствующей суммой в поле field
		select_sum=base.conn.prepare("SELECT "+field[1]+" FROM "+field[0]+" WHERE "+field[1]+"=$1")
		#Для каждой суммы в списке сумм:
		for sum in sums:
			#Проверяется:
			try:
				#Возможность выборки данного значения из данного поля данной таблицы
				records=select_sum(sum)
			#Если невозможно (например не соответствует тип данных)
			except:
				#То ничего
				pass
			#Если возможно
			else:
				#То для каждой найденной записи:
				for record in records:
					#Если данной записи еще нет в результирующем списке:
					if [field[0], field[1]] not in results_sum:
						#К результирующему списку прибавляется список: [таблица, поле, значение]
						results_sum+=[[field[0], field[1]]
						# Для немедленного ознакомления список выводится на экран
						print([field[0], field[1])
		#Подготавливается запрос на выборку поля _idrref для записей с соответствующим словом в поле field
		select_word=base.conn.prepare("SELECT _idrref FROM "+field[0]+" WHERE "+field[1]+" LIKE '%$1%'")
		#Для каждой слова в списке слов:
		for word in words:
			#Проверяется:
			try:
				#Возможность выборки данного значения из данного поля данной таблицы
				records=select_word(word)
			#Если невозможно (например не соответствует тип данных)
			except:
				#То ничего
				pass
			#Если возможно
			else:
				#То для каждой найденной записи:
				for record in records:
					#Если данной записи еще нет в результирующем списке:
					if [field[0], field[1], record] not in results_word:
						#К результирующему списку прибавляется список: [таблица, поле, значение]
						results_word+=[[field[0], field[1], record]]
						# Для немедленного ознакомления список выводится на экран
						print([field[0], field[1], record])
	#Создается пустой список результатов:
	result={}
	#Подготвливается запрос на выборку списка полей данной таблицы
	select_table_fields=base.conn.prepare("SELECT column_name FROM information_schema.columns WHERE table_schema='public' AND table_name=$1")
	#Для каждого результат в списке результатов для сумм:
	for result_sum in results_sum:
		#Создается пустой список idreff для данной суммы:
		results_idreffs=[]
		#Выполняется запрос на выборку списка полей таблицы result[0]
		table_fields=select_table_fields(result_sum[0])[0]
		#Для каждого поля в таблице:
		for table_field in table_fields:
			#Для каждого результата в списке полей-таблиц-значений для слов
			for result_word in results_word:
				#Проверяется:
				try:
					#Запрос на выборку записей из таблицы, в которых в данном поле содержится данный _idrref
					idreffs=base.conn.prepare("SELECT "+table_field+" FROM "+result_sum[0]+" WHERE "+table_field+"=$1")(result_word[2][0])[0]
				#Если невозможно (например не соответствует тип данных)
				except:
					#То ничего
					pass
				#Если возможно
				else:
					#Если результат не пустой и данной записи еще нет в результирующем списке:
					if idreffs and [table_field, result_word[0]] not in results_idreffs:
						#К результирующему списку прибавляется список: [справочная таблица, поле в таблице с суммой]
						results_idreffs+=[[table_field, result_word[0]]]
						# Для немедленного ознакомления список выводится на экран
						print([table_field, result_word[0]])
		result[result_sum[0]]
	
	
	
		
		
	
